//旋转链表
/*给你一个链表的头节点 head ，旋转链表，将链表每个节点向右移动 k 个位置。
链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100
0 <= k <= 2 * 109
*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if (head == nullptr)
            return nullptr;
        int count = 0;
        ListNode* _head = head;
        while (_head->next) {
            count++;
            _head = _head->next;
        }
        count++;
        _head->next = head;
        _head = _head->next;
        for (int i = 1; i < count - (k % count); i++) {
            _head = _head->next;
        }
        ListNode* new_Head = _head->next;
        _head->next = nullptr;
        return new_Head;
    }
};

//面试题 08.06. 汉诺塔问题
/*在经典汉诺塔问题中，有 3 根柱子及 N 个不同大小的穿孔圆盘，盘子可以滑入任意一根柱子。一开始，所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。

请编写程序，用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。
*/
class Solution {
public:
    void move(int n, vector<int>& A, vector<int>& B, vector<int>& C) {
        if (n == 1) {
            C.push_back(A.back());
            A.pop_back();
            return;
        }
        move(n - 1, A, C, B);
        C.push_back(A.back());
        A.pop_back();
        move(n - 1, B, A, C);
    }
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
        move(A.size(), A, B, C);
    }
};



//字符串相乘
/*定两个以字符串形式表示的非负整数 num1 和 num2，返回 num1 和 num2 的乘积，它们的乘积也表示为字符串形式。
注意：不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
1 <= num1.length, num2.length <= 200
num1 和 num2 只能由数字组成。
num1 和 num2 都不包含任何前导零，除了数字0本身。
*/
class Solution {
public:
    string& reverse_string(string& s) {
        int left = 0;
        int right = s.size() - 1;
        while (left < right) {
            swap(s[left], s[right]);
            left++;
            right--;
        }
        return s;
    }
    string add_two_string(string num1, string num2) {
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        string ans = "";
        while (i >= 0 || j >= 0 || add != 0) {
            int x = i >= 0 ? num1[i] - '0' : 0;
            int y = j >= 0 ? num2[j] - '0' : 0;
            int result = x + y + add;
            ans.push_back('0' + result % 10);
            add = result / 10;
            i -= 1;
            j -= 1;
        }
        // 计算完以后的答案需要翻转过来
        reverse(ans.begin(), ans.end());
        return ans;
      
    }
        string multiply(string num1, string num2) {          
        int count = 0;
        string sum;
        sum. push_back('0');
        if( (num1.size ()==1&&num1[0]=='0')||(num2.size()==1&&num2[0]=='0'))
        return sum;
        for (int i = num1.size() - 1; i >= 0; i--) {
            string _num;
            count = 0;
            if(num1[i]-'0')
           {for (int k = 0; k < num1.size() - i - 1; k++) {
                _num += '0';
            }
            for (int j = num2.size() - 1; j >= 0; j--) {
                _num +=
                    (((num2[j] - '0') * (num1[i] - '0')) % 10 + count + '0');
                count = ((num2[j] - '0') * (num1[i] - '0')) / 10;
            }
            if (count) {
                _num += (count + '0');
            }
            reverse_string(_num);
            sum=add_two_string(sum, _num);
        }}
        return sum;
    }
};
     